﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace OpGen.Compiler
{
    /// <summary>
    /// Stellt eine Liste mit Elementen dar
    /// </summary>
    public class ElementCollection : IEnumerable<Element>
    {
        private Dictionary<string, Element> _list = new Dictionary<string, Element>(StringComparer.InvariantCultureIgnoreCase);

        /// <summary>
        /// Fügt der Liste ein neues Element hinzu
        /// </summary>
        /// <param name="element"></param>
        public void Add(Element element)
        {
            _list.Add(element.Elementname, element);
        }

        /// <summary>
        /// Entfernt aus der Liste ein Element
        /// </summary>
        /// <param name="element"></param>
        public void Remove(Element element)
        {
            _list.Remove(element.Elementname);
        }

        /// <summary>
        /// Liefert das Element anhand des Elementnamen
        /// </summary>
        /// <param name="elementName"></param>
        /// <returns></returns>
        public Element this[string elementName]
        {
            get { return _list[elementName]; }
            set { _list[elementName] = value; }
        }

        public Element this[int index]
        {
            get { return _list.Values.Skip(index).FirstOrDefault(); }
            set { /* set the specified index to value here */ }
        }

        /// <summary>
        /// Liefert die Anzahl der Elemente in der Liste
        /// </summary>
        public int Count
        {
            get { return _list.Count; }
        }

        /// <summary>
        /// Löscht die gesamte Liste
        /// </summary>
        public void Clear()
        {
            _list.Clear();
        }

        /// <summary>
        /// Gibt an ob der Elementname bereits vorkommt
        /// </summary>
        /// <param name="elementName"></param>
        /// <returns></returns>
        public bool Contains(string elementName)
        {
            return _list.ContainsKey(elementName);
        }

        /// <summary>
        /// Gibt an ob das Element bereits enthalten ist
        /// </summary>
        /// <param name="element"></param>
        /// <returns></returns>
        public bool Contains(Element element)
        {
            return _list.ContainsValue(element);
        }
        
        #region IEnumerable<ElementBase> Member
        /// <summary>
        /// Wird für ForEach benötigt
        /// </summary>
        /// <returns></returns>
        public IEnumerator<Element> GetEnumerator()
        {
            return _list.Values.GetEnumerator();
        }

        /// <summary>
        /// Wird für ForEach benötigt
        /// </summary>
        /// <returns></returns>
        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
        {
            return _list.Values.GetEnumerator();
        }

        #endregion
    }
}
